#include <vector>

using namespace std;

// 思路： 使用快慢指针寻找环的入口
//   为什么会有环？
// 因为数组中有重复的数字，假设数字的范围是1~n，数组长度是n+1，那么根据抽屉原理，至少有一个数字会被指向两次，从而形成环
class Solution
{
public:
    int findDuplicate(vector<int> &nums)
    {
        int slow = 0;
        int fast = 0;
        while (true)
        {
            slow = nums[slow];
            fast = nums[nums[fast]];
            if (slow == fast)
            {
                break;
            }
        }
        fast = 0;
        while (true)
        {
            slow = nums[slow];
            fast = nums[fast];
            if (slow == fast)
                return slow;
        }
        return slow;
    }
};